package cn.wolfocde.wolf2w.redis.service.impl;

import cn.wolfocde.wolf2w.domain.UserInfo;
import cn.wolfocde.wolf2w.exception.LogicException;
import cn.wolfocde.wolf2w.redis.service.IUserInfoRedisService;
import cn.wolfocde.wolf2w.redis.util.RedisKeys;
import cn.wolfocde.wolf2w.util.AssertUtil;
import cn.wolfocde.wolf2w.util.Consts;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.client.RestTemplate;

import java.util.UUID;
import java.util.concurrent.TimeUnit;

@Service
public class UserInfoRedisServiceImpl implements IUserInfoRedisService {
    @Autowired
    private StringRedisTemplate redisTemplate;
    @Override
    public void sendVerifyCode(String phone,String smsUrl,String smsAppkey) {
        //生成验证码(目的是让网关发送给用户)
        // 0,1,2,3 截取4位数包头不包尾
        String verify_Code = UUID.randomUUID().toString().
                replaceAll("-", "").substring(0, 4);
        String key= RedisKeys.VERIFY_CODE.join(phone);
        //打印模拟的手机短信验证码:
//        拼接验证码和其他文字信息
        StringBuilder sb = new StringBuilder();
        sb.append( "您好, 您的注册验证码是:").append(verify_Code).append("请在")
                .append(Consts.VERIFY_CODE_VAI_TIME).append("分钟之内输入验证码");
        System.out.println(sb+"模拟的手机短信验证码");

//        //真实发送短信:
//        RestTemplate template = new RestTemplate();
//        //参数分别是 1.访问网关公司api的路径;2.返回值封装类型;3.发送短信给用户的手机号;4.要发送的短信内容;
//        // 5.最后一个参数是网关给企业算钱的令牌标识(区分出是哪个企业好收费)
//        String ref = template.getForObject(smsUrl, String.class, phone, sb.toString(), smsAppkey);
//        System.out.println(ref);
//        if (!(ref.contains("succeess"))) {////包含Success或者状态码code是10000表示网关公司帮忙发送短信是成功了
//            throw new LogicException("短信验证码发送失败");
//        }



        //参数1表示验证码的key  参数2表示验证码  参数3表示 存活redis的时间数(5分钟乘以60转成300秒)
        // 参数4表示单位是秒
        redisTemplate.opsForValue().set(key,verify_Code, Consts.VERIFY_CODE_VAI_TIME*60, TimeUnit.SECONDS);
    }


    @Override
    public String getVerifyCode(String phone) {
        String key=RedisKeys.VERIFY_CODE.join(phone);
        String verify_code = redisTemplate.opsForValue().get(key);
        return verify_code;
    }

    /**
     * //生成token,并且最终返回到前端页面
     //拼接好key,同时存入redis
     * @param
     * @return
     */
    @Override
    public String setToken(UserInfo user) {
        //生成token
        // 去掉UUID的-号
        String token = UUID.randomUUID().toString().replaceAll("-","");
         String key = RedisKeys.USER_LOGIN_TOKEN.join(token);
        String strUser = JSON.toJSONString(user);
        redisTemplate.opsForValue().set(key,strUser,RedisKeys.USER_LOGIN_TOKEN.getTime(),TimeUnit.SECONDS);
        return token;
    }

    /**
     *  //获取redis的当前登录用户对象
     *  @param token
     * @return userinfo
     */
    @Override
    public UserInfo getCurrentUserByToken(String token) {
//        token 可能为空,就不执行后面的逻辑查询redis的用户对象了(节省性能)
        if (!StringUtils.hasLength(token)){
            return null;
        }
        //tokrn拼接前缀做key获取当前登录用户对象
        String key = RedisKeys.USER_LOGIN_TOKEN.join(token);
        //如果redis有这个key才获取用户对象(节省性能),
        // 才能返回用户对象给调用者
        if (redisTemplate.hasKey(key)) {
            //获取登录用户对象
            String strUser = redisTemplate.opsForValue().get(key);
            UserInfo user = JSON.parseObject(strUser, UserInfo.class);
            //每次请求访问都延长30分钟
            redisTemplate.expire(key,RedisKeys.
                    USER_LOGIN_TOKEN.getTime(), TimeUnit.SECONDS);
            return user;
        }

        return null;
    }

}
